# -*- coding: utf-8 -*-
"""
乒乓球培训管理系统 - 校区表单

校区管理相关的表单定义
包括校区创建、编辑、搜索等表单
"""

from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import (
    StringField, TextAreaField, SelectField, IntegerField,
    DecimalField, BooleanField, SubmitField, HiddenField
)
from wtforms.validators import (
    DataRequired, Length, Email, NumberRange, Optional, ValidationError
)
from sqlalchemy import and_, or_
from app.models.campus import Campus
from app.models.user import User


class CampusCreateForm(FlaskForm):
    """
    校区创建表单
    """
    name = StringField(
        '校区名称',
        validators=[
            DataRequired(message='校区名称不能为空'),
            Length(2, 50, message='校区名称长度应为2-50个字符')
        ],
        render_kw={'placeholder': '请输入校区名称'}
    )

    address = StringField(
        '校区地址',
        validators=[
            DataRequired(message='校区地址不能为空'),
            Length(5, 200, message='校区地址长度应为5-200个字符')
        ],
        render_kw={'placeholder': '请输入详细地址'}
    )

    phone = StringField(
        '联系电话',
        validators=[
            DataRequired(message='联系电话不能为空'),
            Length(11, 15, message='联系电话格式不正确')
        ],
        render_kw={'placeholder': '请输入联系电话'}
    )

    email = StringField(
        '邮箱地址',
        validators=[
            Optional(),
            Email(message='邮箱格式不正确')
        ],
        render_kw={'placeholder': '请输入邮箱地址（可选）'}
    )

    admin_id = SelectField(
        '校区管理员',
        coerce=int,
        validators=[Optional()],
        choices=[],
        render_kw={'class': 'form-select'}
    )

    capacity = IntegerField(
        '容纳人数',
        validators=[
            DataRequired(message='容纳人数不能为空'),
            NumberRange(min=10, max=1000, message='容纳人数应在10-1000之间')
        ],
        render_kw={'placeholder': '校区最大容纳人数'}
    )

    area = DecimalField(
        '场地面积',
        validators=[
            Optional(),
            NumberRange(min=50, max=10000, message='场地面积应在50-10000平方米之间')
        ],
        render_kw={'placeholder': '场地面积（平方米）'}
    )

    description = TextAreaField(
        '校区描述',
        validators=[
            Optional(),
            Length(max=500, message='描述不能超过500个字符')
        ],
        render_kw={
            'placeholder': '请输入校区描述信息（可选）',
            'rows': 4
        }
    )

    facilities = TextAreaField(
        '设施设备',
        validators=[
            Optional(),
            Length(max=500, message='设施设备描述不能超过500个字符')
        ],
        render_kw={
            'placeholder': '请描述校区的设施设备（可选）',
            'rows': 3
        }
    )

    operating_hours = StringField(
        '营业时间',
        validators=[
            Optional(),
            Length(max=100, message='营业时间描述不能超过100个字符')
        ],
        render_kw={'placeholder': '例如：周一至周日 09:00-22:00'}
    )

    photo = FileField(
        '校区照片',
        validators=[
            Optional(),
            FileAllowed(['jpg', 'jpeg', 'png', 'gif'], '只支持图片格式（jpg, jpeg, png, gif）')
        ]
    )

    is_active = BooleanField(
        '启用状态',
        default=True,
        description='取消勾选将禁用此校区'
    )

    submit = SubmitField('创建校区')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 获取可用的管理员选项（没有分配校区的管理员）
        available_admins = User.query.filter(
            and_(
                User.role == 'campus_admin',
                User.status == 'active',
                User.campus_id.is_(None)
            )
        ).all()

        self.admin_id.choices = [(0, '暂不分配')] + [
            (admin.id, f"{admin.real_name} ({admin.username})")
            for admin in available_admins
        ]

    def validate_name(self, field):
        """验证校区名称是否已存在"""
        campus = Campus.query.filter_by(name=field.data).first()
        if campus:
            raise ValidationError('该校区名称已存在，请选择其他名称')

    def validate_phone(self, field):
        """验证电话号码格式"""
        import re
        if not re.match(r'^1[3-9]\d{9}$|^0\d{2,3}-?\d{7,8}$', field.data):
            raise ValidationError('电话号码格式不正确')

    def validate_admin_id(self, field):
        """验证管理员是否可用"""
        if field.data:
            admin = User.query.get(field.data)
            if not admin:
                raise ValidationError('选择的管理员不存在')
            if admin.role != 'campus_admin':
                raise ValidationError('选择的用户不是校区管理员')
            if admin.status != 'active':
                raise ValidationError('选择的管理员账户未激活')
            if admin.campus_id:
                raise ValidationError('该管理员已分配给其他校区')


class CampusEditForm(CampusCreateForm):
    """
    校区编辑表单
    继承创建表单，调整验证逻辑
    """
    campus_id = HiddenField()
    submit = SubmitField('保存修改')

    def __init__(self, campus=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.campus = campus

        if campus:
            self.campus_id.data = campus.id
            # 编辑时，管理员选项包括当前管理员和未分配的管理员
            available_admins = User.query.filter(
                and_(
                    User.role == 'campus_admin',
                    User.status == 'active',
                    or_(User.campus_id.is_(None), User.campus_id == campus.id)
                )
            ).all()

            self.admin_id.choices = [(0, '暂不分配')] + [
                (admin.id, f"{admin.real_name} ({admin.username})")
                for admin in available_admins
            ]

    def validate_name(self, field):
        """验证校区名称是否已存在（排除当前校区）"""
        campus = Campus.query.filter_by(name=field.data).first()
        if campus and campus.id != self.campus.id:
            raise ValidationError('该校区名称已存在，请选择其他名称')

    def validate_admin_id(self, field):
        """验证管理员是否可用（排除当前校区管理员）"""
        if field.data:
            admin = User.query.get(field.data)
            if not admin:
                raise ValidationError('选择的管理员不存在')
            if admin.role != 'campus_admin':
                raise ValidationError('选择的用户不是校区管理员')
            if admin.status != 'active':
                raise ValidationError('选择的管理员账户未激活')
            if admin.campus_id and admin.campus_id != self.campus.id:
                raise ValidationError('该管理员已分配给其他校区')


class CampusSearchForm(FlaskForm):
    """
    校区搜索表单
    """
    keyword = StringField(
        '关键词',
        validators=[Optional()],
        render_kw={'placeholder': '搜索校区名称、地址或管理员'}
    )

    status = SelectField(
        '状态',
        choices=[
            ('', '全部状态'),
            ('active', '正常'),
            ('inactive', '禁用')
        ],
        validators=[Optional()],
        render_kw={'class': 'form-select'}
    )

    has_admin = SelectField(
        '管理员状态',
        choices=[
            ('', '全部'),
            ('yes', '已分配管理员'),
            ('no', '未分配管理员')
        ],
        validators=[Optional()],
        render_kw={'class': 'form-select'}
    )

    sort_by = SelectField(
        '排序方式',
        choices=[
            ('created_at_desc', '创建时间（新到旧）'),
            ('created_at_asc', '创建时间（旧到新）'),
            ('name_asc', '校区名称（A-Z）'),
            ('name_desc', '校区名称（Z-A）'),
            ('capacity_desc', '容纳人数（大到小）'),
            ('capacity_asc', '容纳人数（小到大）')
        ],
        default='created_at_desc',
        validators=[Optional()],
        render_kw={'class': 'form-select'}
    )

    submit = SubmitField('搜索')


class CampusDeleteForm(FlaskForm):
    """
    校区删除确认表单
    """
    campus_id = HiddenField(validators=[DataRequired()])
    confirm_text = StringField(
        '确认删除',
        validators=[
            DataRequired(message='请输入确认文本'),
        ],
        render_kw={'placeholder': '请输入"删除"以确认操作'}
    )
    submit = SubmitField('确认删除', render_kw={'class': 'btn btn-danger'})

    def validate_confirm_text(self, field):
        """验证确认文本"""
        if field.data != '删除':
            raise ValidationError('请正确输入"删除"以确认操作')


class CampusBatchForm(FlaskForm):
    """
    校区批量操作表单
    """
    campus_ids = HiddenField(validators=[DataRequired(message='请选择要操作的校区')])
    action = SelectField(
        '批量操作',
        choices=[
            ('activate', '启用'),
            ('deactivate', '禁用'),
            ('delete', '删除')
        ],
        validators=[DataRequired(message='请选择操作类型')],
        render_kw={'class': 'form-select'}
    )
    submit = SubmitField('执行操作')

    def validate_campus_ids(self, field):
        """验证选择的校区ID"""
        try:
            ids = [int(id.strip()) for id in field.data.split(',') if id.strip()]
            if not ids:
                raise ValidationError('请选择要操作的校区')
            # 验证校区是否存在
            campus_count = Campus.query.filter(Campus.id.in_(ids)).count()
            if campus_count != len(ids):
                raise ValidationError('选择的校区中包含无效数据')
        except ValueError:
            raise ValidationError('校区ID格式不正确')